package com.ntd.study.reges;

import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ReUtil;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * java 正则相关学习
 * ^ 匹配字符串开始标识
 * $ 匹配字符串结束标识
 * \s 匹配空格
 * \b 匹配一个字边界，即字与空格间的位置。例如，"er\b"匹配"never"中的"er"，但不匹配"verb"中的"er"。
 * \B 匹配一个非边界
 * \d 匹配数字 [0-9]
 * \D 匹配非数字 [^0-9]
 * \f 换页符匹配 等效于 \x0c 和 \cL。
 * \n 换行符匹配 等效于 \x0a 和 \cJ。
 * \r 回车符匹配 等效于 \x0d 和 \cM。
 * \s 匹配任何空白字符 包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。
 * \S 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。
 * \t 制表符匹配。与 \x09 和 \cI 等效。
 * \v 垂直制表符匹配。与 \x0b 和 \cK 等效。
 * \w 匹配任何字类字符，包括下划线。与"[A-Za-z0-9_]"等效。
 * \W 匹配任何非字类字符，包括下划线。与"[^A-Za-z0-9_]"等效。
 * . 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符，请使用诸如"[\s\S]"之类的模式。
 * x|y 匹配到x或者y
 * [xyz] 匹配到 x或者y或者z
 * [^xyz] 匹配到 非x或者y或者z
 * [a-z] 匹配a到z之间的字符
 * [^a-z] 匹配非a到z之间的字符
 * \. 匹配 "."
 * <p>
 * + 大于等于1个 {1,}
 * * 零次或者多次匹配 {0,}
 * ? 零次或者一次匹配 {0,1}
 * ? 设置括号内的选项是可选的  例(d+)?
 * ? 当此字符紧随任何其他限定符（*、+、?、{n}、{n,}、{n,m}）之后时，匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串，而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如，在字符串"oooo"中，"o+?"只匹配单个"o"，而"o+"匹配所有"o"。
 * <p>
 * <p>
 * todo 参考菜鸟教程：未理解
 * \xn 匹配 n，此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如，"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。
 * \num 匹配 num，此处的 num 是一个正整数。到捕获匹配的反向引用。例如，"(.)\1"匹配两个连续的相同字符。
 * \n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式，那么 n 是反向引用。否则，如果 n 是八进制数 (0-7)，那么 n 是八进制转义码。
 * \nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式，那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获，则 n 是反向引用，后面跟有字符 m。如果两种前面的情况都不存在，则 \nm 匹配八进制值 nm，其中 n 和 m 是八进制数字 (0-7)。
 * \nml 当 n 是八进制数 (0-3)，m 和 l 是八进制数 (0-7) 时，匹配八进制转义码 nml。
 * \\un 匹配 n，其中 n 是以四位十六进制数表示的 Unicode 字符。例如，\u00A9 匹配版权符号 (©)。
 */
public class RegexDemo {


    public static void main(String[] args) {
        String re = "\\{\\{(.*)\\}\\}";
        final String s = ReUtil.get(re, "This is the payload: {{payload}} !", 0);
        final String s1 = ReUtil.replaceAll("test", "\\{\\{(.*)\\}\\}", "This is the payload: {{payload}} !");
        Console.log(s1);
    }

    private static void regex2() {
        // 创建 Pattern 对象->按指定模式在字符串查找->现在创建 matcher 对象
        Matcher m = Pattern.compile("(\\d+)(\\D+)").matcher("aaa123aaa");
        if (m.find()) {
            System.out.println(m.group(0)); // 整体匹配：123aaa
            System.out.println(m.group(1)); // 第一个括号匹配：123
            System.out.println(m.group(2)); // aaa
        }
    }

    /**
     * 判断包含
     */
    private static void isContain() {
// 判断字符串是否包含 test
        final boolean matches = Pattern.matches(".*test.*", "123456test123456");
        System.out.println(matches);
    }
}
